Redis是一个开源的高性能键值对数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,并借助许多高层级的接口使其可以胜任如缓存、队列系统等不同的角色。
Redis是REmote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据(key,value的形式),并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样,Redis字典中的键值除了可以是字符串,还可以是其他数据类型。到目前为止Redis支持的键值数据类型如下:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
本文总结了 Redis 常用的命令,根据数据类型对他们进行分类
字符串类型
- _key value_SET 赋值
- GET key 取值 GETGET
- INCR key 递增数字
- INCRBY key increment 增加指定的整数
- DECR key 递减数字
- DECR key decrement 减少指定的整数
- INCRBYFLOAT key increment 增加指定的浮点数
- APPEND key value 向尾部追加值
- STRLEN key 获取字符串长度
- MGET key [key …] 同时获得多个健值
- MSET key value [key value …] 同时设置多个健值
散列类型
散列类型(hash)的键值也是一种字典结构,有点类似于javascript的对象,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多232-1个字段。
- HSET key field value 给健的字段赋值,不区分插入和更新操作
- HGET key field 获得健里字段的值
- HMSET key field value [field value …] 同时给多个字段赋值
- HMGET key field [field ..] 同时取多个字段的值
- HMGETALL key 获取健中所有字段和字段值
- HEXISTS key field 判断字段是否存在
- HSETNX key field value 当字段不存在是赋值
- HINCRBY key field increment 增加数字
- HDEL key field [field …] 删除一个或多个字段
- HKEYS key 只获取全部字段名
- HVALS key 只获取全部字段值
- HLEN key 获取健的字段数量
列表类型
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的。
与散列类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳232-1个元素。
- LPUSH key value [value …] 向列表左边增加元素,返回值表示增加元素后列表的长度
- RPUSH key value [value …] 向列表右边增加元素的话则使用RPUSH命令,其用法和LPUSH命令一样
- LPOP key 从列表左边弹出一个元素,返回被移除的元素值
- RPOP key 从列表右边弹出一个元素,返回被移除的元素值
- LLEN key 获取列表中的元素个数,当键不存在时LLEN会返回0
LRANGE key start stop 获得列表索引从start到stop之间的所有元素(包含两端的元素)但不会删除该片段,起始索引为0,”-1”表示最右边第一个元素。
(1)如果start的索引位置比stop的索引位置靠后,则会返回空列表。
(2)如果stop大于实际的索引范围,则会返回到列表最右边的元素。LREM key count value 删除列表中前count个值为value的元素,返回值是实际删除的元素个数
- 当count > 0时LREM命令会从列表左边开始删除前 count个值为 value的元素;
- 当count < 0时LREM命令会从列表右边开始删除前|count|个值为value的元素;
- 当count = 0是LREM命令会删除所有值为value的元素。例如:
LINDEX key index 获得指定索引的元素值
- LSET key index value 设置指定索引的元素值,它会将索引为index的元素赋值为value
- LTRIM key start end 删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同
- LINSERT key BEFORE|AFTER privot value 向列表中插入元素,LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。LINSERT命令的返回值是插入后列表的元素个数
- RPOPLPUSH source destination 将元素从一个列表转到另一个列表
集合类型
集合的概念高中的数学课就学习过。在集合中的每个元素都是不同的,且没有顺序。一个集合类型(set)键可以存储至多232 -1个(相信这个数字对大家来说已经很熟悉了)字符串。集合类型和列表类型有相似之处,但很容易将它们区分开来
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是O(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算
- SADD key member [member …] 向集合中增加一个或多个元素,如果键不存在则会自动创建,返回值是成功加入的元素数量
- SREM key member [member …] 从集合中删除一个或多个元素,并返回删除成功的个数
- SMEMBERS key 获得集合中的所有元素
- SISMEMBER key 判断元素是否在集合中
- SDIFF key [key …] 用来对多个集合执行差集运算。集合A与集合B的差集表示为A-B,代表所有属于A且不属于B的元素构成的集合
- SINTER key [key …] 用来对多个集合执行交集运算。集合A与集合B的交集表示为A ∩ B,代表所有属于A且属于B的元素构成的集合,即A ∩ B = {x | x ∈ A且x∈B}
- SUNION key [key …] SUNION命令用来对多个集合执行并集运算。集合A与集合B的并集表示为A∪B,代表所有属于A或属于B的元素构成的集合(如图3-15所示),即A∪B = {x | x∈A或x ∈B}
- SCARD key 获取集合中元素个数
- SDIFFSTORE destination key [key …] SDIFFSTORE命令和SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在destination键中。
- SINTERSTORE destination key [key …] SDIFFSTORE命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。
- SUNIONSTORE destination key [key …] SINTERSTORE和SUNIONSTORE命令与之类似,不再赘述。
SRANDMEMBER key [count] 用来随机从集合中获取一个元素,还可以传递count参数来一次随机获得多个元素
(1)当count为正数时,SRANDMEMBER会随机从集合里获得count个不重复的元素。如果count的值大于集合中的元素个数,则SRANDMEMBER会返回集合中的全部元素。
(2)当 count 为负数时,SRANDMEMBER会随机从集合里获得|count|个的元素,这些元素有可能相同。SPOP key 会从集合中随机选择一个元素弹出并在原集合中删除它
有序集合类型
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。
有序集合类型在某些方面和列表类型有些相似。
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。但是二者有着很大的区别,
这使得它们的应用场景也是不同的。
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
(4)有序集合要比列表类型更耗费内存。
- ZADD key score member [ score member …] ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素),分数不仅可以是整数,还支持双精度浮点数
- ZSCORE key member 获得元素的分数
- ZRANGE key start stop [WITHSCORES] 按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素), 如果需要同时获得元素的分数的话可以在ZRANGE命令的尾部加上WITHSCORES参数
- ZREVRANGE key start stop [WITHSCORES] 和ZRANGE的唯一不同在于ZREVRANGE命令是按照元素分数从大到小的顺序给出结果的。
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 参数虽然多,但是都很好理解。该命令按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素,如果希望分数范围不包含端点值,可以在分数前加上“(”符号,min和max还支持无穷大,同ZADD命令一样,-inf和+inf分别表示负无穷和正无穷
- ZINCRBY key increment member 增加某个元素的分数
- ZCARD key 获得集合元素的数量
- ZCOUNT key min max 获取指定分数范围内的元素个数
- ZREM key member [member …] 删除一个或多个元素,返回值是成功删除的元素数量(不包含本来就不存在的)
- ZREMRANGEBYRANK key start stop 按照元素分数从小到大的顺序(即索引0表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量
- ZREMRANGEBYSCORE key min max 删除指定分数范围内的所有元素
- ZRANK key member 会按照元素分数从小到大的顺序获得指定的元素的排名(从0开始,即分数最小的元素排名为0)
- ZREVRANK key member ZREVRANK命令则相反(分数最大的元素排名为0)
- ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中的元素个数。ZINTERSTORE命令还能够通过WEIGHTS参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重
- 当AGGREGATE是SUM时(也就是默认值),destination键中元素的分数是每个参与计算的集合中该元素分数的和
- 当AGGREGATE是MIN时,destination键中元素的分数是每个参与计算的集合中该元素分数的最小值
- 当AGGREGATE是MAX时,destination键中元素的分数是每个参与计算的集合中该元素分数的最大值
另外还有一个命令与ZINTERSTORE命令的用法一样,名为ZUNIONSTORE,它的作用是计算集合间的并集,这里不再赘述。
总结
以上就是 Redis 常用的数据类型以及命令总结拾遗,学习和使用的时候要多对比,才能更加融会贯通